package com.anivia.system.service.service.impl;

import com.anivia.common.core.model.dto.IdsDTO;
import com.anivia.common.util.AssertUtil;
import com.anivia.common.util.BeanUtil;
import com.anivia.system.service.mapper.DictInfoMapper;
import com.anivia.system.service.model.dto.DictAddOrUpdateDTO;
import com.anivia.system.service.model.entity.DictInfoDO;
import com.anivia.system.service.service.IDictInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;


/**
 * <p>
 * 字典表 服务实现类
 * </p>
 *
 * @author wangj
 */
@Service
public class DictInfoServiceImpl extends ServiceImpl<DictInfoMapper, DictInfoDO> implements IDictInfoService {
    @Override
    public void saveOrUpdate(DictAddOrUpdateDTO dto) {

        // 判断名称是否已存在
        boolean existsName = this.lambdaQuery().eq(DictInfoDO::getDictName, dto.getDictName())
                .eq(DictInfoDO::getPid, dto.getPid())
                .ne(dto.getId() != null, DictInfoDO::getId, dto.getId())
                .exists();
        AssertUtil.isFalse(existsName, "名称已存在");

        // 判断code是否已存在
        boolean existsCode = this.lambdaQuery()
                .eq(DictInfoDO::getCode, dto.getCode())
                .exists();
        AssertUtil.isFalse(existsCode, "code已存在");


        // 获取父级字典信息
        DictInfoDO parentDict = this.lambdaQuery()
                .select(DictInfoDO::getPid, DictInfoDO::getCode)
                .eq(DictInfoDO::getId, dto.getPid())
                .one();
        AssertUtil.notNull(parentDict, "父级不存在");

        DictInfoDO dictInfoDO = null;
        if (dto.getId() == null) {
            // 创建新的字典对象
            dictInfoDO = BeanUtil.newBean(dto, DictInfoDO.class);

            // 设置字典的code为父级字典的code
            dictInfoDO.setCode(parentDict.getCode());
        } else {
            // 获取要更新的字典对象
            dictInfoDO = this.getById(dto.getId());
            AssertUtil.notNull(dictInfoDO, "要更新的字典不存在");
            // 复制dto属性到dictInfoDO对象
            BeanUtil.copyProperties(dto, dictInfoDO);
        }
        // 保存或更新字典对象
        this.saveOrUpdate(dictInfoDO);
    }


    @Override
    public void delete(IdsDTO idsDTO) {
        this.removeBatchByIds(idsDTO.getIds());
    }

}
